//
// Created by gxy on 2025/8/31.
//

#include <common.h>


ListNode* findCross(ListNode* str1,ListNode* str2) {
    ListNode* p=str1->next;
    ListNode* q=str2->next;
    while (q&&p) {
        p=p->next;
        q=q->next;
        if (p==q&&p!=nullptr) {
            return p;
        }
    }
    //第一次交换
    if (q==nullptr) {
        q=str1->next;
    }
    if (p==nullptr) {
        p=str2->next;
    }

    while (q&&p) {
        p=p->next;
        q=q->next;
        if (p==q&&p!=nullptr) {
            return p;
        }
    }
    //第二次交换
    if (q==nullptr) {
        q=str1->next;
    }
    if (p==nullptr) {
        p=str2->next;
    }

    while (q&&p) {
        p=p->next;
        q=q->next;
        if (p==q&&p!=nullptr) {
            return p;
        }
    }
    return nullptr;
}
int main(int argc, char *argv[]) {
    ListNode* head=ListNode::of({1,2,3,4,5,6});

    ListNode* l2=ListNode::of({7,8});
    l2->next->next=head->next->next->next;
    auto res= findCross(head,l2);
    std::cout<<res->val<<std::endl;
    return 0;
}
